#pragma order

#include "global.h"
#include "modbus.h"
#include "freq_table.h"

// modbus 寄存器变量定义

//==========================================================
// RO-BIT
//==========================================================
uchar bdata ro_bit_1    = 0;
sbit x_at_home              = ro_bit_1 ^ 0; // x在原点
sbit y_at_home              = ro_bit_1 ^ 1; // Y在原点
sbit z_at_home              = ro_bit_1 ^ 2; // z在原点
sbit pick_cup_sensor        = ro_bit_1 ^ 3; // 抓手已下降到抓杯/放杯位置。1：到位；0：不到位。
sbit holding_cup            = ro_bit_1 ^ 4; // 抓手中有无测试杯状态 1：有； 0：无
sbit y_at_limit             = ro_bit_1 ^ 5; // Y限位状态 1：在限位位置；0：不在限位位置

//==========================================================
// RW-BIT
//==========================================================
uchar bdata rw_bit_1    = 0;
sbit elector_manget         = rw_bit_1 ^ 0; // 设置抓手电磁铁状态。写入 1 使能电磁铁，打开抓手；写入 0 关闭电磁铁，关闭抓手

//==========================================================
// RO-WORD
//==========================================================
long x_pos                      = 0;        // x当前坐标, step
long y_pos                      = 0;        // Y当前坐标，step
long z_pos                      = 0;        // z当前坐标，step
ushort x_duration               = 0;        // x运动经过的时间, ms
long x_distance                 = 0;        // x经过的位移
ushort y_duration               = 0;        // Y运动经过的时间
long y_distance                 = 0;        // Y经过的位移
ushort z_duration               = 0;        // Z运动经过的时间
long z_distance                 = 0;        // Z经过的位移
long z_pick_cup_pos             = 0;        // z检测到的抓杯/放杯位置

//==========================================================
// RW-WORD
//==========================================================
ushort x_max_speed          = 4000;         // X最大速度, 0.01 rad/sec^2
long x_max_distance         = 1350;         // X最大行程
ushort y_max_speed          = 8000;         // Y最大速度, 0.01 rad/sec^2
long y_max_distance         = 10000;        // Y最大行程
ushort z_max_speed          = 3000;         // z最大速度，0.01 rad/sec^2
long z_max_distance         = 1200;         // z最大行程
ushort reserved1            = 680;          // 保留
ushort action               = 0;            // 动作指令
long x_target               = 480;          // X目标位置
long y_target               = 383;          // y目标位置
long z_target               = 4800;         // z目标位置
long flags                  = 0;            // 动作标识
long x_target_2             = 465;          // X目标坐标2
long y_target_2             = 383;          // y目标坐标2
long z_target_2             = 4800;         // z目标坐标2
RECT range                  = { 0 };        // 运行范围
RECT block[MAX_BLOCK_COUNT] = { 0 };        // 禁止运行范围

//==========================================================
// DIAGNOSTIC
//==========================================================
ushort  diagnostic                  = 0;        // 诊断寄存器
ushort  bus_message_count           = 0;        // 总线上消息数量
ushort  bus_error_count             = 0;        // 总线上通讯错误数量
ushort  bus_exception_count         = 0;        // 总线上异常应答数量
ushort  server_message_count        = 0;        // 下位机消息数量
ushort  server_no_response_count    = 0;        // 下位机未响应消息数量
ushort  server_exception_count      = 0;        // 下位机异常应答消息数量
ushort  server_busy_count           = 0;        // 下位机状态忙数量
ushort  bus_char_overrun_count      = 0;        // 总线字符过载（Overrun）数量

ushort  server_status               = 0;        // 下位机状态

uchar bdata program_status          = 0;
sbit ps_listen_only     = program_status ^ 0;   // 处于只听模式
sbit ps_server_busy     = program_status ^ 1;   // 设备忙

uchar event_count;
uchar event_log[MAX_EVENT_COUNT];

//==========================================================
// FILES
//==========================================================
